/*
 * 黄奕雄
 * 2014-09-04
 * QQ:378112711
 * 版本：2.0
 */
(function(factory){
    if(typeof define === 'function' && define.amd){
        define(['jquery'],factory);
    }else{
        factory(window.jQuery);
    }
}(function($){
    
    $.selectbox = function (obj, opt) {
        var opts = $.extend({}, $.selectbox.defaults);        
        
        var time = (new Date()).valueOf();
        var eid=obj.id==''?time:obj.id;
        
        var $select = $(obj);
        if($("#"+eid+"_wrapper").length){
            $select.siblings().remove();
            $select.show().unwrap();
        }
        if($select.data('w')){
            opts.w=$select.data('w');
        }
        $select.wrap('<div id="'+eid+'_wrapper" class="select_container" />');
        var swrap=$('#'+eid+'_wrapper');
        swrap.addClass(opts.divclass);
        if($select.attr('class')){
            swrap.addClass($select.attr('class'));
            $select.removeAttr('class');
        }
        if($select.attr('style')){
            swrap.attr('style',$select.attr('style'));
            $select.removeAttr('style');
        }
        var ul=$('<ul id="'+eid+'_ul" />');
        ul.addClass('select_ul');
        var $input = setInput(opts);
        //$select.hide().before($input).before(ul);
        $select.hide().before($input);
        $('body').append(ul);
        
        function setOptions(opt){
            if (typeof(opt) !== 'object') opt = {};
            opts = $.extend(opts, opt);
        }
        setOptions(opt);
        
        init=function(){
            ul.empty();
            $select.children('option').each(function() {
                var $li=$('<li />');
                $li.attr({  v: $(this).val(),style:'width:auto;margin:0;padding:0'});
                $li.html($(this).text());
                if ($(this).is(':selected')) {
                    var str=$(this).text();
                    var strs=opts.cutstr?str.substring(0,opts.cutstr):str;
                    $input.html(strs);

                    $li.addClass(opts.currentClass);
                }
                ul.append($li);
            });
        };
        init();
        //事件处理
        ul.delegate('li','hover',function(){ $(this).toggleClass(opts.hoverClass); });
        ul.delegate('li','click',function(){
            $(this).addClass(opts.currentClass).siblings().removeClass(opts.currentClass);
            var str=$(this).html();
            var strs=opts.cutstr?str.substring(0,opts.cutstr):str;
            $input.html(strs);
            setCurrent();
            hideMe();
            if($.isFunction(opts.callback)){
                opts.callback($(this),$select);
            }
            return false;
        });
        var timer=null;
        $input.click(function(){
            $(ul).is(":visible")?hideMe():showMe();
        }).hover(function(){
            clearTimeout(timer);
        },function(){
            timer=setTimeout(function(){hideMe();},200);
        });
        
        ul.hover(function(){
            clearTimeout(timer);
        },function(){
            timer=setTimeout(function(){hideMe();},200);
        });
        
        setul();
        function setul(){
            var W=$input.outerWidth();
            var H=$input.outerHeight();
            var ipl=parseInt($.css($input[0],'padding-left'));
            var ipr=parseInt($.css($input[0],'padding-right'));
            var iplr=ipl+ipr;
            
            ul.show().css({top:(H-1)+'px',left:'0px',bottom:'auto',height:'auto',width:'auto','border-width':'0px 1px 1px',visibility:'visible'});
            
            ul.find('li').css({'width':'auto','padding':'0px'});
            var ULW=ul.width()>$input.width()?ul.width():$input.width();
                        
            var bw=parseInt($input.css('border-left-width'));
            $(window).resize(function(){
                var eTop=0,eLeft=0;
                /*if(window.top!=window.self){
                    var iframe=null;
                    $("iframe",window.parent.document).each(function(){
                        if(document.body.ownerDocument === this.contentWindow.document) {
                            iframe = this;
                        }
                    });                    
                    var dl=$(iframe).offset();      
                    var dlt=dl.top;
                    var dll=dl.left;
                    
                    eTop = dlt+$input.offset().top+$input.outerHeight();
                    eLeft = dll+$input.offset().left;
                }else{*/
                    eTop=$input.offset().top+$input.outerHeight();
                    eLeft=$input.offset().left;
                //}
                if(bw==0){eLeft=eLeft-1}
                ul.css({top:(eTop)+'px',left:eLeft+'px'});
            });
            $(window).resize();
            
            if(opts.w==''){
                ul.css({width:(ULW-2+iplr)+'px'}).hide();
                ul.find('li').css({'width':ULW-2,'padding':'0px '+ipr+'px 0px '+ipl+'px'});
                $input.css({width:(ULW-2)+'px'});
            }else{
                ul.css({width:(opts.w+iplr)+'px'}).hide();
                ul.find('li').css({'width':(opts.w)+'px','padding':'0px '+ipr+'px 0px '+ipl+'px'});
                $input.css({width:opts.w});
            }
            
            if(bw!==0){ ul.css({'border-color':$input.css('border-left-color')}); }
            
        }
        function hideMe() {
            ul.hide();swrap.removeClass('shover');swrap.css('z-index','9');
        }
        function showMe(){
            swrap.addClass('shover'); setul();ul.show();swrap.css('z-index',10);
        }
        
        function setCurrent(){
            var li = $("li."+opts.currentClass, ul);
            $select.val(li.attr('v'));
        }
        function setInput() {
            var $input = $('<div />');
            $input.attr({"id": eid+"_input","class":"select_input"});
            return $input;
        }       
        
        
        var api = {
            init:init,
            setOptions: setOptions
        };
        
        $(obj).data('Jselect', api);
        return api;
    };
    $.fn.selectbox = function (options, callback){
        var api;
        this.each(function () {
            if ($(this).data('Jselect')) {
                if (options === 'api') return $(this).data('Jselect');
                else $(this).data('Jselect').setOptions(options);
            } else {
                api = $.selectbox(this, options);
                if ($.isFunction(callback)) callback.call(api);
            }
        });
        return this;
    };
    $.selectbox.defaults = {
        divclass:'selectbox',
        hoverClass:'current',
        currentClass:'selected',
        w:'',
        fun:null
    };
}));